const { SceneryModel, CityModel } = require('../../models/index')
const { Op } = require('sequelize')

// 获取景点总数
const getSceneryCount = async (req, res) => {
  try {
    const sceneryCountValue = await SceneryModel.count()

    // 统计成功返回响应
    res.status(200).json({
      title: '景点总数',
      data: sceneryCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取景点列表信息
const getSceneryList = async (req, res) => {
  try {
    // 从分页中间件中获取分页信息
    const { offset, pageSize } = req.pagination;

    const sceneryList = await SceneryModel.findAndCountAll({
      attributes: ['scenery_id', 'name', 'images', 'price', 'rating', 'grade', 'type', 'is_hot'],
      include: [
        {
          model: CityModel,
          as: 'scenery_locatedCity',
          attributes: ['name']
        }
      ],
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 将数据转化为前端期望的格式
    const formData = {
      count: sceneryList.count,
      rows: sceneryList.rows.map(item => {
        return {
          id: item.scenery_id,
          name: item.name,
          image: item.images.map((item) => item.url),
          price: item.price,
          rating: item.rating,
          grade: item.grade,
          type: item.type,
          is_hot: item.is_hot,
          city: item.scenery_locatedCity.name
        }
      })
    }

    res.status(200).json({
      title: '景点列表信息',
      data: formData
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 景点列表搜索功能
const searchScenery = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const sceneryItem = await SceneryModel.findAll({
      include: [
        {
          model: CityModel,
          as: 'scenery_locatedCity',
          attributes: ['name']
        }
      ],
      where: {
        [Op.or]: [
          { name: { [Op.like]: `%${searchText}%` } },
          { price: { [Op.like]: `%${searchText}%` } },
          { rating: { [Op.like]: `%${searchText}%` } },
          { grade: { [Op.like]: `%${searchText}%` } },
          { type: { [Op.like]: `%${searchText}%` } },
          { '$scenery_locatedCity.name$': { [Op.like]: `%${searchText}%` } }
        ]
      }
    })

    // 将数据转化为前端期望的格式
    const formData = sceneryItem.map(item => {
      return {
        id: item.scenery_id,
        name: item.name,
        image: item.images.map((item) => item.url),
        price: item.price,
        rating: item.rating,
        grade: item.grade,
        type: item.type,
        is_hot: item.is_hot,
        city: item.scenery_locatedCity.name
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: formData
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 景点热门状态切换
const toggleHotScenery = async (req, res) => {
  try {
    // 获取景点ID
    const id = req.params.id

    if (!id) {
      return res.status(400).json({ error: '景点ID不能为空！' })
    }

    const hotScenery = await SceneryModel.findByPk(id)

    // 景点不存在的情况
    if (!hotScenery) {
      return res.status(400).json({ error: '景点不存在！' })
    }

    // 切换景点热门状态
    await hotScenery.update({ is_hot: !hotScenery.is_hot })

    // 返回成功响应
    res.status(200).json({
      title: '切换成功',
      message: '景点热门状态切换成功！'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 删除景点
const deleteScenery = async (req, res) => {
  try {
    // 获取景点ID
    const id = req.params.id

    const result = await SceneryModel.destroy({
      where: {
        scenery_id: id
      }
    })

    // 检查是否有记录被删除
    if (result === 0) {
      return res.status(404).json({ error: '没有找到需要删除的景点记录！' })
    }

    // 删除成功后返回响应
    res.status(200).json({
      title: '删除成功',
      message: '景点记录已被成功删除!',
      data: result
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 发布景点
const publishSceneryData = async (req, res) => {
  try {
    // 获取景点ID
    const id = req.body.scenery_id

    // 获取上传的景点数据
    const data = req.body

    // 如果景点ID存在则进行修改景点信息操作，否则就进行新建发布景点信息操作
    if (id) {
      const sceneryItem = await SceneryModel.findByPk(id)

      // 未找到景点的情况
      if (!sceneryItem) {
        return res.status(404).json({ error: '未找到需要修改的景点信息！' })
      }

      // 找到景点后修改信息
      const updateScenery = await sceneryItem.update(data)

      // 返回修改成功的响应
      res.status(200).json({
        title: '修改景点信息成功',
        data: updateScenery.id
      })
    } else {
      const publishNewScenery = await SceneryModel.create(data)
      // 返回创建成功的响应
      res.status(200).json({
        title: '发布景点成功',
        data: publishNewScenery.id
      })
    }
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getSceneryCount,
  getSceneryList,
  searchScenery,
  toggleHotScenery,
  deleteScenery,
  publishSceneryData
}